package cn.edu.cug.cs.gtl.gsm.aof;

import cn.edu.cug.cs.gtl.common.Identifier;
import cn.edu.cug.cs.gtl.gsm.item.DataItem;

import java.io.IOException;

public interface DataFiles {
    /**
     * 设置当前数据文件的序号，从0开始
     * @param order
     */
    void setCurrentFileOrder(int order) ;

    /**
     * 创建当前的数据文件，长度为0
     * @return
     * @throws IOException
     */
    boolean create() throws IOException;

    /**
     * 删除当前的数据文件
     * @return
     * @throws IOException
     */
    boolean drop() throws IOException;

    /**
     * 判断当前序号的数据文件是否存在
     * @return
     * @throws IOException
     */
    boolean exists() throws IOException;

    /**
     * 将数据项写入当前数据文件中，由于是AOF，直接将页面内容添加到文件末尾
     * 注意：只需要写入dataItem.getPageContent()的内容
     * @param dataItem
     * @return
     * @throws IOException
     */
    boolean write(DataItem dataItem) throws IOException;

    /**
     * 从当前序号的数据文件中，读取指定页面位置的信息，长度为pageSize
     * 在当前文件中的页面定位计算方法如下：
     * int order = metaItem.getCollectionOrder(pageIdentifier);
     * long pos = pageIdentifier.longValue()-metaItem.getCollectionSize()* order;
     * pos = pos * metaItem.getPageSize();
     * 也即：
     * pos = (page-collectionSize*order)*pageSize;
     * @param pageIdentifier
     * @return
     * @throws IOException
     */
    DataItem read(Identifier pageIdentifier) throws IOException;
}
